package com.yuma.springaiga.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.metadata.Usage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class ChatController {

    @Autowired
    private ChatClient client;

    /*public ChatController(ChatClient.Builder clientBuilder) {
        // 角色预设给AI设置的
        clientBuilder.defaultSystem("你是御码教育的一名老师，你精通Java开发，你的名字叫全知。");
        this.client = clientBuilder.build();
    }*/

    // 1.实现一个简单的聊天功能
    @GetMapping("/chat")
    public String chat(@RequestParam(value="msg", defaultValue = "你是谁") String msg) {
        // 1.设置提示词
        return client.prompt()  //提示词
                 .user(msg)  //用户输入信息
                 .call()   // 请求大模型,问题都生成之后才显示
                 .content();  // 返回文本
    }

    @GetMapping("/token")
    public String token(@RequestParam(value="msg", defaultValue = "你是谁") String msg) {
        // 1.设置提示词
        ChatClient.CallResponseSpec call = client.prompt()  //提示词
                .user(msg)  //用户输入信息
                .call();// 请求大模型,问题都生成之后才显示
        Usage usage = call.chatResponse().getMetadata().getUsage();
        return "total_tokens本次请求的整体资源消耗：" + usage.getTotalTokens() +", " +
                "prompt_tokens用户输入的提示词被模型处理时消耗的token数量:" + usage.getPromptTokens() + ", " +
                "completion_tokens模型生成的回答所用的token数量: " + usage.getCompletionTokens();
    }

    @GetMapping(value = "/stream",produces = "text/html;charset=utf-8")
    public Flux<String> stream(@RequestParam(value="msg", defaultValue = "你是谁") String msg) {
        // 1.设置提示词
        return client.prompt()  //提示词
                .user(msg)  //用户输入信息
                .stream()   // 请求大模型，流式是逐个字符输出
                .content();  // 返回文本
    }

    @GetMapping("/ali/bool/{age}")
    public Boolean formatBool(@PathVariable int age) {
        return client
                .prompt()
                .system("""
                    请判断用户信息是否成年?
                    只能用 true 或 false 回答，不要输出多余内容
                    """)
                .user(u -> u
                        .text("我今年已经{age}岁了")
                        .param("age", age))
                .call()
                .entity(Boolean.class);
    }

    public record Boss (
        String bossName,
        char sex
    ){}

    public record Company(
            String companyName,        // 收件人姓名
            Boss boss,
            String address,
            String business
    ){}


    @GetMapping("/ali/addr")
    public Company formatAddr() {
        Company company = client.prompt()
                .system("""
                        请从下面这条文本中提取公司信息
                        """)
                .user("大连御码科技有限公司，负责人李晶（男），公司地址：大连嘉创大厦16楼，业务范围是IT培训")
                .call()
                .entity(Company.class);
        return company;
    }
}
